package coreClass;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.StringJoiner;

public class StringDemo {


    // Java编译器对String有特殊处理，即可以直接用"ABC"来表示一个字符串
    // 实际上字符串在String内部是通过一个char[]数组表示的
    static String s1 = "Hello!";
    static String s2 = new String(new char[] {'H', 'e', 'l', 'l', 'o', '!'});

    private static final String ORIGINAL_STRING = "  \tJava字符串处理\r\n ";
    private static final String PHONE_NUMBER = "010-12345678";
    private static final String MIXED_STRING = "A,,B;C ,D";

    public static void stringOperationExample() {
        System.out.println(s1.equals(s2));
        System.out.println(s1.isEmpty());   // String还提供了isEmpty()和isBlank()来判断字符串是否为空和空白字符串


        // 字符串的操作:
            // Java字符串String是不可变对象；
            // 字符串操作不改变原字符串内容，而是指向新字符串
            // 从String的不变性设计可以看出，如果传入的对象有可能改变，我们需要复制而不是直接引用

        // 使用trim()方法可以移除字符串首尾空白字符。空白字符包括空格，\t，\r，\n
        // 1. 去除首尾空白字符
        String trimmed = ORIGINAL_STRING.trim();
        System.out.println("[去除首尾空白] 原始字符串: " + ORIGINAL_STRING);
        System.out.println("处理后结果: \"" + trimmed + "\"");



        // 2. 字符替换（演示字符串不可变性）一种是根据字符或字符串替换 另一种是通过正则表达式替换
        String original = "hello";
        String replaced = original.replace('l', 'w');
        System.out.println("\n[字符替换] 原始字符串: " + original);
        System.out.println("替换后字符串: " + replaced);
        System.out.println("原始字符串未被修改: " + original);



        // 3. 子串替换（大小写敏感）
        String replacedSub = original.replace("ll", "~~");
        System.out.println("\n[子串替换] 替换结果: " + replacedSub);


        // 1. 使用正则表达式清洗数据
        String cleaned = MIXED_STRING.replaceAll("[,\\;\\s]+", ", ");
        System.out.println("\n[正则清洗] 原始数据: " + MIXED_STRING);
        System.out.println("清洗结果: " + cleaned);

        // 2. 电话号码格式验证
        boolean isValidPhone = PHONE_NUMBER.matches("^0\\d{2,3}-\\d{7,8}$");
        System.out.println("\n[电话验证] " + PHONE_NUMBER + " 格式" +
                (isValidPhone ? "有效" : "无效"));


        // 高级字符串操作:字符串分割
        String csv = "Java,Python,C++,JavaScript";
        String[] languages = csv.split(",");
        System.out.println("\n[字符串分割] 原始数据: " + csv);
        System.out.println("分割结果: " + Arrays.toString(languages));


        // 常用的字符串操作：提取子串、查找、替换、大小写转换等

        // 格式化字符串



    }



    //Java使用Unicode编码表示String和char；
        //转换编码就是将String和byte[]转换，需要指定编码；
        //转换为byte[]时，始终优先考虑UTF-8编码。

    // 字符串编码转换演示
    public static void demonstrateEncodingExample() {
        try {
            // 1. 字符串转字节数组
            String chinese = "编码测试";
            byte[] utf8Bytes = chinese.getBytes(StandardCharsets.UTF_8);

            // 2. 字节数组转字符串（正确编码）
            String decoded = new String(utf8Bytes, "UTF-8");
            System.out.println("\n[编码转换] 原始字符串: " + chinese);
            System.out.println("UTF-8编码字节: " + Arrays.toString(utf8Bytes));
            System.out.println("解码结果: " + decoded);

            // 3. 错误编码演示
            String wrongDecoded = new String(utf8Bytes, "ISO-8859-1");
            System.out.println("错误解码结果: " + wrongDecoded);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
    /**
     * 字符串格式化演示
     */
    public static void demonstrateFormattingExample() {
        // 1. 使用String.format
        String dateStr = String.format("%04d-%02d-%02d", 2023, 9, 15);
        System.out.println("\n[日期格式化] " + dateStr);

        // 2. 使用MessageFormat
        String message = MessageFormat.format(
                "用户: {0} | 年龄: {1} | 余额: {2,number,currency}",
                "张三", 28, 1500.5
        );
        System.out.println("[复杂格式化] " + message);

        // 3. 字符串拼接优化
        StringJoiner joiner = new StringJoiner(", ", "[", "]");
        joiner.add("苹果").add("香蕉").add("橙子");
        System.out.println("[字符串拼接] " + joiner);
    }


    public static void main(String[] args) {
        StringDemo.stringOperationExample();
        demonstrateEncodingExample();
        demonstrateFormattingExample();
    }

}
